package com.ruoyi.common.core.utils;

import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

public class ImageUtil {
    // 支持的图片扩展名
    private static final List<String> ALLOWED_EXTENSIONS = Arrays.asList("jpg", "jpeg", "png", "gif", "bmp", "webp");

    // 文件大小限制：5MB
    private static final long MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB

    /**
     * 判断上传的文件是否是图片格式且大小不超过5MB
     *
     * @param file 上传的文件
     * @throws RuntimeException 如果文件格式不正确或大小超过限制，会抛出异常
     */
    public static void validateImage(MultipartFile file) {
        // 1. 判断文件扩展名
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || originalFilename.isEmpty()) {
            throw new RuntimeException("文件名为空");
        }
        String extension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();
        if (!ALLOWED_EXTENSIONS.contains(extension)) {
            throw new RuntimeException("不支持的图片格式");
        }

        // 2. 判断 MIME 类型
        String contentType = file.getContentType();
        if (contentType == null || !contentType.startsWith("image/")) {
            throw new RuntimeException("上传的文件不是图片类型");
        }

        // 3. 判断文件大小（不能超过5MB）
        if (file.getSize() > MAX_FILE_SIZE) {
            throw new RuntimeException("文件大小超过限制，最大允许 5MB");
        }

        // 4. 尝试读取文件内容（确保文件是真正的图片）
        try(InputStream inputStream = file.getInputStream()) {
            BufferedImage image = ImageIO.read(inputStream);
            if (image == null) {
                throw new RuntimeException("文件内容不是合法图片");
            }
        } catch (IOException e) {
            throw new RuntimeException("图片解析失败", e);
        }
        System.out.println("数据校验通过");
    }
}
